home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / mem / poolrealloc.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-12  |  1.7 KB  |  89 lines

  1.  
  2. #include "tek/mem.h"
  3.  
  4. /* 
  5. **    TEKlib
  6. **    (C) 2001 TEK neoscientists
  7. **    all rights reserved.
  8. **
  9. **    TAPTR TPoolRealloc(TAPTR mp, TAPTR poolmem, TUINT size)
  10. **
  11. **    reallocate memory from a pooled allocator.
  12. **
  13. */
  14.  
  15. TAPTR TPoolRealloc(TAPTR mp, TAPTR poolmem, TUINT size)
  16. {
  17.     if (mp)
  18.     {
  19.         TMEMPOOL *pool = (TMEMPOOL *) mp;
  20.         TPOOLNODE **mem = (TPOOLNODE **) poolmem;
  21.         TPOOLNODE *poolnode;
  22.  
  23.         size = (size + pool->align) & ~pool->align;
  24.  
  25.         if (mem)
  26.         {
  27.             poolnode = *(--mem);
  28.             if (size)
  29.             {
  30.                 TMEMNODE *memnode = (TMEMNODE *) ((TBYTE *) mem - pool->memnodesize);
  31.                 TUINT realnodesize = memnode->size;
  32.                 if (realnodesize != size + sizeof(TPOOLNODE *))
  33.                 {
  34.                     TPOOLNODE **newmem;
  35.                     
  36.                     newmem = TStaticRealloc(&poolnode->memhead, mem, size + sizeof(TPOOLNODE *));
  37.                     if (newmem)
  38.                     {
  39.                         *newmem++ = (TPOOLNODE *) poolnode;
  40.                         return newmem;
  41.                     }
  42.  
  43.                     newmem = TPoolAlloc(pool, size);
  44.                     if (newmem)
  45.                     {
  46.                         TMemCopy32(poolmem, newmem, TMIN(realnodesize - sizeof(TPOOLNODE *), size));
  47.  
  48.                         TStaticFree(&poolnode->memhead, mem);
  49.                         if (poolnode->memhead.freesize == poolnode->numbytes)
  50.                         {
  51.                             TRemove((TNODE *) poolnode);
  52.                             TMMUFree(pool->handle.mmu, (TAPTR) poolnode);
  53.                         }
  54.                         return newmem;
  55.                     }
  56.                 }
  57.                 else
  58.                 {
  59.                     /* same size requested */
  60.                 
  61.                     return mem;
  62.                 }
  63.             }
  64.             else
  65.             {
  66.                 /* size zero requested from a valid allocation */
  67.             
  68.                 TStaticFree(&poolnode->memhead, mem);
  69.         
  70.                 if (poolnode->memhead.freesize == poolnode->numbytes)
  71.                 {
  72.                     TRemove((TNODE *) poolnode);
  73.                     TMMUFree(pool->handle.mmu, (TAPTR) poolnode);
  74.                 }
  75.                 return TNULL;
  76.             }
  77.         }
  78.         else
  79.         {
  80.             if (size)
  81.             {
  82.                 return TPoolAlloc(pool, size);
  83.             }
  84.         }
  85.     }
  86.  
  87.     return TNULL;
  88. }
  89.